package com.divemotor.ventarepuestosinternet.model;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import com.divemotor.ventarepuestosinternet.beans.adapter.VehiculoAdapter;

@Entity
@Table(name = "REP_MOV_IMAGEN_REPUESTO")
@NamedQueries({
	@NamedQuery(name="ImagenRepuesto.listarPorDescripcion", 
				query="SELECT new com.divemotor.ventarepuestosinternet.beans.adapter.ImagenRepuestoAdapter(ir.idImagenRepuesto, r.nombre, ir.observacion, ir.posicion, " +
					  "ir.estado, ir.cantidadReferencial, i.nombreArchivo) " +
					  "FROM ImagenRepuesto ir JOIN ir.imagen i JOIN ir.repuesto r " +
					  "WHERE LOWER(r.nombre) LIKE :descripcion AND ir.estado = :estado " +
					  "ORDER BY r.nombre"),
    @NamedQuery(name="ImagenRepuesto.buscarPorDescripcion", 
				query="SELECT new com.divemotor.ventarepuestosinternet.beans.adapter.ImagenRepuestoAdapter(ir.idImagenRepuesto, r.nombre, ir.observacion, ir.posicion, " +
					  "ir.estado, ir.cantidadReferencial, i.nombreArchivo) " +
					  "FROM ImagenRepuesto ir INNER JOIN ir.imagen i INNER JOIN ir.repuesto r INNER JOIN i.modeloFabrica mf INNER JOIN mf.listaVehiculoModeloFabrica vmf INNER JOIN vmf.vehiculo ve " +
					  "WHERE LOWER(r.nombre) LIKE :descripcion AND ir.estado = :estado AND ve.chasis = :chasis " +
					  "ORDER BY r.nombre"),
	@NamedQuery(name="ImagenRepuesto.repuestoImagenRepuesto", 
				query="SELECT new com.divemotor.ventarepuestosinternet.beans.adapter.ImagenRepuestoAdapter(ir.idImagenRepuesto, r.nombre, ir.observacion || ' ' || ir.txtObsRepuesto2, ir.posicion, " +
					  "ir.estado, ir.cantidadReferencial) " +
					  "FROM ImagenRepuesto ir JOIN ir.imagen i JOIN ir.repuesto r " +
					  "WHERE i.idImagen = :idImagen AND ir.indRepReemplazo = :indRepReemplazo AND ir.estado IN (:estado) " +
					  "AND ir.idImagenRepuesto IN (SELECT imr.imagenRepuestoNroSaPK.numIdImagenRepuesto " +
					  							  "FROM ImagenRepuestoNroSa imr, VehiculoNroSa vns " +
					  							  "WHERE imr.imagenRepuestoNroSaPK.numIdImagenRepuesto = ir.idImagenRepuesto " +
					  							  "AND vns.vehiculoNroSaPK.nroCorrSa = imr.imagenRepuestoNroSaPK.nroCorrSa " +
					  							  "AND vns.vehiculoNroSaPK.nroExtSa = imr.imagenRepuestoNroSaPK.nroExtSa " +
					  							  "AND vns.vehiculoNroSaPK.numChasis = :chasis " +
					  							  "AND vns.vehiculoNroSaPK.codGrupo = :grupo)" +
				  	  "ORDER BY ir.posicion")
})
public class ImagenRepuesto implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.SEQUENCE , generator="SEQ_REP_MOV_IMAGEN_REPUESTO")
	@SequenceGenerator(name = "SEQ_REP_MOV_IMAGEN_REPUESTO", sequenceName = "REPUESTOS.SEQ_REP_MOV_IMAGEN_REPUESTO", allocationSize = 0)
	@Column(name="NUM_ID_IMAGEN_REPUESTO")
	private Integer idImagenRepuesto;
	@Column(name="NUM_POSICION")
	private Integer posicion;
	@Column(name="CAN_REFERENCIAL")
	private Integer cantidadReferencial;
	@Column(name = "IND_ESTADO", length=1)
	private String estado;
	@Column(name="OBS_IMAGEN_REPUESTO")
	private String observacion;
	@Column(name="IND_REP_REEMPLAZO")
	private String indRepReemplazo;
	@Column(name="IND_REP_OPCIONAL")
	private String indRepOpcional;
	@Column(name="TXT_OBS_REPUESTO_2")
	private String txtObsRepuesto2;
	@Column(name="NUM_SEQ_NUM")
	private Integer numSeqNum;
	@Temporal(TemporalType.DATE)
	@Column(name = "fec_creacion")
	private Date fechaCreacion;
	@Temporal(TemporalType.DATE)
	@Column(name = "fec_modificacion")
	private Date fechaModificacion;
	@Temporal(TemporalType.DATE)
	@Column(name = "fec_eliminacion")
	private Date fechaEliminacion;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="NUM_ID_IMAGEN", referencedColumnName="NUM_ID_IMAGEN", insertable = true, updatable = true)
	private Imagen imagen;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="NUM_ID_REPUESTO", referencedColumnName="NUM_ID_REPUESTO", insertable = true, updatable = true)
	private Repuesto repuesto;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="COD_ID_USUARIO_CREACION",referencedColumnName="COD_ID_USUARIO" )
	private Usuario usuarioCreacion;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="COD_ID_USUARIO_MODIFICACION",referencedColumnName="COD_ID_USUARIO")
	private Usuario usuarioModificacion;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="COD_ID_USUARIO_ELIMINACION",referencedColumnName="COD_ID_USUARIO")
	private Usuario usuarioEliminacion;
	@OneToMany(fetch=FetchType.LAZY)
	@JoinTable(name = "REP_MOV_IMAGEN_REP_NUMERO_SA", 
			   joinColumns = @JoinColumn(name = "NUM_ID_IMAGEN_REPUESTO", referencedColumnName="NUM_ID_IMAGEN_REPUESTO")) 
	private List<ImagenRepuestoNroSa> numerosSa;
	
	@Transient
	private String keyListado;
	@Transient
	private Integer cantidad;
	@Transient
	private VehiculoAdapter vehiculoAdapter;
	@Transient
	private String nombreRepuesto;
	@Transient
	private String obsImagenRepuesto;
	
	public ImagenRepuesto() {
		this.imagen = new Imagen();
		this.repuesto = new Repuesto();
	}

	public Integer getIdImagenRepuesto() {
		return idImagenRepuesto;
	}

	public void setIdImagenRepuesto(Integer idImagenRepuesto) {
		this.idImagenRepuesto = idImagenRepuesto;
	}

	public Imagen getImagen() {
		return imagen;
	}

	public void setImagen(Imagen imagen) {
		this.imagen = imagen;
	}

	public Repuesto getRepuesto() {
		return repuesto;
	}

	public void setRepuesto(Repuesto repuesto) {
		this.repuesto = repuesto;
	}

	public Integer getPosicion() {
		return posicion;
	}

	public void setPosicion(Integer posicion) {
		this.posicion = posicion;
	}

	public String getKeyListado() {
		return keyListado;
	}

	public void setKeyListado(String keyListado) {
		this.keyListado = keyListado;
	}

	public Integer getCantidadReferencial() {
		return cantidadReferencial;
	}

	public void setCantidadReferencial(Integer cantidadReferencial) {
		this.cantidadReferencial = cantidadReferencial;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public Usuario getUsuarioCreacion() {
		return usuarioCreacion;
	}

	public void setUsuarioCreacion(Usuario usuarioCreacion) {
		this.usuarioCreacion = usuarioCreacion;
	}

	public Usuario getUsuarioModificacion() {
		return usuarioModificacion;
	}

	public void setUsuarioModificacion(Usuario usuarioModificacion) {
		this.usuarioModificacion = usuarioModificacion;
	}

	public Usuario getUsuarioEliminacion() {
		return usuarioEliminacion;
	}

	public void setUsuarioEliminacion(Usuario usuarioEliminacion) {
		this.usuarioEliminacion = usuarioEliminacion;
	}

	public Date getFechaCreacion() {
		return fechaCreacion;
	}

	public void setFechaCreacion(Date fechaCreacion) {
		this.fechaCreacion = fechaCreacion;
	}

	public Date getFechaModificacion() {
		return fechaModificacion;
	}

	public void setFechaModificacion(Date fechaModificacion) {
		this.fechaModificacion = fechaModificacion;
	}

	public Date getFechaEliminacion() {
		return fechaEliminacion;
	}

	public void setFechaEliminacion(Date fechaEliminacion) {
		this.fechaEliminacion = fechaEliminacion;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public String getObservacion() {
		return observacion;
	}

	public void setObservacion(String observacion) {
		this.observacion = observacion;
	}
	
	public Integer getCantidad() {
		return cantidad;
	}

	public void setCantidad(Integer cantidad) {
		this.cantidad = cantidad;
	}

	public VehiculoAdapter getVehiculoAdapter() {
		return vehiculoAdapter;
	}

	public void setVehiculoAdapter(VehiculoAdapter vehiculoAdapter) {
		this.vehiculoAdapter = vehiculoAdapter;
	}
	
	public String getNombreRepuesto() {
		return nombreRepuesto;
	}

	public void setNombreRepuesto(String nombreRepuesto) {
		this.nombreRepuesto = nombreRepuesto;
	}

	public String getIndRepReemplazo() {
		return indRepReemplazo;
	}

	public void setIndRepReemplazo(String indRepReemplazo) {
		this.indRepReemplazo = indRepReemplazo;
	}

	public String getIndRepOpcional() {
		return indRepOpcional;
	}

	public void setIndRepOpcional(String indRepOpcional) {
		this.indRepOpcional = indRepOpcional;
	}

	public String getTxtObsRepuesto2() {
		return txtObsRepuesto2;
	}

	public void setTxtObsRepuesto2(String txtObsRepuesto2) {
		this.txtObsRepuesto2 = txtObsRepuesto2;
	}

	public Integer getNumSeqNum() {
		return numSeqNum;
	}

	public void setNumSeqNum(Integer numSeqNum) {
		this.numSeqNum = numSeqNum;
	}

	public String getObsImagenRepuesto() {
		return obsImagenRepuesto;
	}

	public void setObsImagenRepuesto(String obsImagenRepuesto) {
		this.obsImagenRepuesto = obsImagenRepuesto;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((idImagenRepuesto == null) ? 0 : idImagenRepuesto.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj){
			return true;
		}
		if (obj == null){
			return false;
		}
		if (getClass() != obj.getClass()){
			return false;
		}
		ImagenRepuesto other = (ImagenRepuesto) obj;
		if (idImagenRepuesto == null) {
			if (other.idImagenRepuesto != null){
				return false;
			}
		} else if (!idImagenRepuesto.equals(other.idImagenRepuesto)){
			return false;
		}
		return true;
	}
	
	
	
}
